# -*- coding: utf-8 -*-
from flask import current_app
from flask import g
from flask import request

from info import db
from info.models import News, Comment, CommentLike, User
from info.utils.common import user_login_data
from info.utils.response_code import RET
from . import news_blue
from flask import render_template, jsonify

"""关注与取消关注"""
@news_blue.route("/followed_user",methods = ["GET","POST"])
@user_login_data
def followed_user():
    # 当前用户必须登陆才可以关注别人
    user = g.user
    if not user:
        return jsonify(errno=RET.PARAMERR,errmsg= "请先登陆")

    # 从前端获取被关注的用户id
    followed_user_id = request.json.get("user_id")
    action = request.json.get("action")
    # 要是关注动作的话，只需要往我关注的认得列表中添加被关注的人
    # 查询出当前的作者对象
    try:

        followed_user=User.query.get(followed_user_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno = RET.NODATA,errmsg="数据查询失败")
    # 我关注所有人的列表user.followed
    if action == "follow":
        # 说明是关注动作
        if followed_user not in user.followed:
            user.followed.append(followed_user)
        else:
            return jsonify(errno = RET.PARAMERR,errmsg = "已经关注了该用户")

    else:
        # 取消关注
        if followed_user in user.followed:
            user.followed.remove(followed_user)
        else:
            return jsonify(errno = RET.NODATA,errmsg = "没有关注该用户")
    db.session.commit()
    return jsonify(errno = RET.OK,errmsg = "ok")





"""评论点赞"""


@news_blue.route("/comment_like", methods=["GET", "POST"])
@user_login_data
def comment_like():
    user = g.user
    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg="请登录用户")
    comment_id = request.json.get("comment_id")
    news_id = request.json.get("news_id")  # 用不上
    action = request.json.get("action")
    # 点赞是基于用户的行为，所以先要判断用户有没有登陆


    # new = News.query.get(news_id)  # 当前新闻对象   用不上

    comment = Comment.query.get(comment_id)  # 当前评论对象

    # 评论点赞首先要判断当前的用户有没有点赞，要是没有添加点赞，然后在新闻点赞数量加1
    if action == "add":
        # 获取当前点赞对象
        comment_like = CommentLike.query.filter(CommentLike.comment_id == comment_id,
                                                CommentLike.user_id == user.id).first()
        # 如果当前用户在当前评论上没有点赞才能点赞
        if not comment_like:
            comment_like = CommentLike()
            comment_like.comment_id = comment_id
            comment_like.user_id = user.id
            db.session.add(comment_like)
            comment.like_count += 1
    else:

        comment_like = CommentLike.query.filter(CommentLike.comment_id == comment_id,
                                                CommentLike.user_id == user.id).first()
        if comment_like:
            db.session.delete(comment_like)
            comment.like_count -= 1

    db.session.commit()

    return jsonify(errno=RET.OK, errmsg="评论点赞成功")


"""新闻评论"""


@news_blue.route("/news_comment", methods=["GET", "POST"])
@user_login_data
def news_comment():
    news_id = request.json.get("news_id")
    # 获取评论的内容
    comment_str = request.json.get("comment")
    parent_id = request.json.get("parent_id")
    # 获取当前新闻
    news = News.query.get(news_id)

    # 新闻评论是一个用户行为
    user = g.user
    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg="请先登陆")
    # 创建comment对象
    comment = Comment()
    comment.user_id = user.id
    comment.news_id = news.id
    comment.content = comment_str
    if parent_id:
        comment.parent_id = parent_id

    db.session.add(comment)
    db.session.commit()

    return jsonify(errno=RET.OK, errmsg="评论成功", data=comment.to_dict())


"""
新闻收藏
"""


@news_blue.route("/news_collect", methods=["GET", "POST"])
@user_login_data
def news_collect():
    # 因为需要收藏新闻,所以需要把新闻id传递过来,不然我不清楚要收藏哪条新闻
    news_id = request.json.get("news_id")
    # 我们需要收藏新闻,如果不把动作做告诉我,我不清楚到底是收藏还是取消
    action = request.json.get("action")
    # 因为需要收藏新闻,肯定需要先把新闻查询出来才能收藏
    news = News.query.get(news_id)

    if not news:
        return jsonify(errno=RET.NODATA, errmsg="没有这条新闻")

    user = g.user
    # 因为收藏新闻是用户行为,所以必须得判断当前用户是否已经登陆,只有登陆才可以收藏新闻
    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg="请登陆")

    if action == 'collect':
        # 说明是想收藏新闻
        user.collection_news.append(news)
    else:
        # 说明想取消收藏
        user.collection_news.remove(news)

    db.session.commit()
    return jsonify(errno=RET.OK, errmsg="收藏成功")


"""新闻详情"""


@news_blue.route("/<int:news_id>")
@user_login_data
def news_detail(news_id):
    user = g.user
    """
       获取到右边的热门点击新闻
    """
    news = News.query.order_by(News.clicks.desc()).limit(10)
    news_list = []
    for new_mode in news:
        news_list.append(new_mode.to_dict())

    # 根据id查询出具体表示哪条新闻
    news = News.query.get(news_id)

    """
    新闻收藏:
    1 通过一个变量进行控制是否已经收藏,is_collected = true:已经收藏 is_collected = false:说明没有收藏
    2 如果需要收藏新闻,那么收藏新闻是一个用户的动作,必须要用户登陆才可以收藏 ,如果user有值的话,就说明已经登陆
    3 判断当前是否有这条新闻,如果有新闻才能收藏,都没有新闻,肯定就没有办法收藏
    4 判断当前的这条新闻是否在我收藏的新闻列表当中,如果在说明当前新闻已经被收藏,如果新闻被收藏,那么我们就可以is_collected = True
    """
    # 如果是第一次进来,那么肯定是没有收藏,所以这个值默认就是false
    is_collected = False
    if user:
        if news in user.collection_news:
            is_collected = True

    """
    查询新闻评论的列表：
    1.首先获取新闻评论，那么需要很据新闻的id进行查询出来所有的新闻
    2.根据评论的时间，进行倒叙
    """
    comments = Comment.query.filter(Comment.news_id == news_id).order_by(Comment.create_time.desc()).all()

    """分析当前新闻所有评论中被登录用户点过赞的有哪些：
    1.首先取出当前新闻所有的评论
    2.查找出当前用户的所有评论点赞id
    3.如果当前新闻的所有评论id在  当前用户的所有评论点赞id中，那么就添加is_like=True
    """
    comment_like_ids = []
    comment_list = []
    comment_likes = []
    # 只有用户登陆才可以执行这两步
    if user:
        # 查看当前用户点过的所有的赞
        comment_likes = CommentLike.query.filter(CommentLike.user_id == user.id).all()
        # 找到当前用户点过所有的赞的id
        comment_like_ids = [comment_like.comment_id for comment_like in comment_likes]

    for comment in comments:

        #   取出所有的当前评论评论字典
        comment_dict = comment.to_dict()
        # 每一条评论第一次被添加的时候，都是没有被点赞的，所以为False
        comment_dict["is_like"] = False
        # 3.如果当前新闻的所有评论id在  当前用户的所有评论点赞id中，那么就添加is_like=True
        if comment.id in comment_like_ids:
            comment_dict["is_like"] = True
        # 添加到当前新闻的评论列表中
        comment_list.append(comment_dict)

        # TODO 添加关注

    # 第一次进来的时候
    is_followed=False
    if user:
        if news.user in user.followed:
            is_followed=True


    data = {
        "user_info": user.to_dict() if user else None,
        "is_collected": is_collected,
        "news": news.to_dict(),
        "click_news_list": news_list,
        "comments": comment_list
    }

    return render_template("news/detail.html", data=data)
